package com.example.bledemo.tool;

import java.util.Objects;

/**
 * Created by Peter_Z.
 * <p>
 * Date: 2024/10/14 0014
 */
// A* 算法中的节点类
public class Node implements Comparable<Node> {
    private final Point position; // 假设Point类是不可变的，因此使用final
    public int G;
    public int H;
    // F不是一个字段，而是一个计算属性（getter方法）

    // Parent不是一个final字段，因为它可能会在后续被修改（例如，在路径寻找算法中）
    public Node parent;

    // 构造函数
    public Node(Point position, int g, int h, Node parent) {
        this.position = Objects.requireNonNull(position, "Position cannot be null");
        this.G = g;
        this.H = h;
        this.parent = parent;
    }

    // 提供一个便利的构造函数，允许使用默认值
    public Node(Point position) {
        this(position, 0, 0, null);
    }

    // 获取Position
    public Point getPosition() {
        return position;
    }

    // 计算F的值（G + H）
    public int getF() {
        return G + H;
    }

    // 实现Comparable接口的方法
    @Override
    public int compareTo(Node other) {
        return Integer.compare(this.getF(), other.getF());
    }

    // 重写equals方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Node node = (Node) obj;
        return Objects.equals(this.position, node.position);
    }

    // 重写hashCode方法
    @Override
    public int hashCode() {
        return Objects.hash(position);
    }
}